package controlador;

import clases.Almacen;
import java.sql.SQLException;
import java.util.ArrayList;
import modelo.Conexion;
import modelo.MdlAlmacen;

/**
 * Clase que maneja
 * @author Edder
 * @version 1.0
 */
public class CtrlAlmacen implements Controlador<Almacen>{
    private final MdlAlmacen mdlAlmacen;
    private final Conexion cnx;
    
    public CtrlAlmacen(){
        this.mdlAlmacen = new MdlAlmacen();
        this.cnx = Conexion.getConexionDefault();
    }
    
    /**
     * Este método inserta un Almacen, y a la vez asigna el id insertado al objeto
     * Si Conexion es null, trabaja con conexion propia
     * @param almacen Objeto de clases.Almacen con los datos a insertar (sin idAlmacen)
     * @param cnx
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    @Override
    public void insert(Almacen almacen, Conexion cnx) throws ClassNotFoundException, SQLException{                
        if(cnx == null){
            this.cnx.abrirConexion();
            this.cnx.abrirTransaccion();
            this.mdlAlmacen.insert(almacen, this.cnx);
            almacen.setIdAlmacen(this.mdlAlmacen.getLastId(this.cnx));
            this.cnx.cerrarTransaccion();
            this.cnx.cerrarConexion();
        }else{
            this.mdlAlmacen.insert(almacen, cnx);
            almacen.setIdAlmacen(this.mdlAlmacen.getLastId(cnx));
        }
    }
    
    /**
     * Este método actualiza la información del almacén
     * Si Conexion es null, trabaja con conexion propia
     * @param almacen Objeto de clases.Almacen
     * @param cnx
     * @throws SQLException
     * @throws ClassNotFoundException
     * @see MdlAlmacen.update(Almacen almacen)
     */
    @Override
    public void update(Almacen almacen, Conexion cnx) throws SQLException, ClassNotFoundException{
        if(cnx == null){
            this.cnx.abrirConexion();
            this.mdlAlmacen.update(almacen, this.cnx);
            this.cnx.cerrarConexion();
        }else{
            this.mdlAlmacen.update(almacen, cnx);
        }
    }
    
    public void dar_baja(Almacen almacen, Conexion cnx) throws ClassNotFoundException, SQLException{
        if(cnx == null){
            this.cnx.abrirConexion();
            this.mdlAlmacen.dar_baja(almacen, this.cnx);
            this.cnx.cerrarConexion();
        }else{
            this.mdlAlmacen.dar_baja(almacen, cnx);
        }
    }
    
    /**
     * Este método devuelve un ArrayList de almacenes cuyo nombre coincide con el parámetro %query%
     * Si Conexion es null, trabaja con conexion propia
     * @param query Cadena con la consulta de almacen por ejemplo: "Principal"
     * @param cnx
     * @return ArrayList - Lista de almacenes según búsqueda
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public ArrayList<Almacen> getAlmacenes(String query, Conexion cnx) throws ClassNotFoundException, SQLException{
        ArrayList<Almacen> almacenes;
        if(cnx == null){
            this.cnx.abrirConexion();
            almacenes = this.mdlAlmacen.getAlmacenes(query, this.cnx);
            this.cnx.cerrarConexion();
        }else{
            almacenes = this.mdlAlmacen.getAlmacenes(query, cnx);
        }        
        return almacenes;
    }
    
    /**
     * Este método devuelve un ArrayList de almacenes cuyo nombre coincide con el parámetro %query%
     * Si Conexion es null, trabaja con conexion propia
     * @param query Cadena con la consulta de almacen por ejemplo: "Principal"
     * @param cnx
     *
     * @param estado @return ArrayList - Lista de almacenes según búsqueda
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public ArrayList<Almacen> getAlmacenes_estado(String query, char estado, Conexion cnx) throws ClassNotFoundException, SQLException{
        ArrayList<Almacen> almacenes;
        if(cnx == null){
            this.cnx.abrirConexion();
            almacenes = this.mdlAlmacen.getAlmacenes_estado(query, estado, this.cnx);
            this.cnx.cerrarConexion();
        }else{
            almacenes = this.mdlAlmacen.getAlmacenes_estado(query, estado, cnx);
        }        
        return almacenes;
    }
    
    /**
     * Este método devuelve un objeto Almacen según el id
     * Si Conexion es null, trabaja con conexion propia
     * @param idAlmacen Un dato int con el id del Almacén
     * @param cnx
     * @return Almacen
     * @throws SQLException
     * @throws ClassNotFoundException 
     */
    @Override
    public Almacen get(int idAlmacen, Conexion cnx) throws SQLException, ClassNotFoundException{
        Almacen almacen;
        if(cnx == null){
            this.cnx.abrirConexion();
            almacen = this.mdlAlmacen.get(idAlmacen, this.cnx);
            this.cnx.cerrarConexion();
        }else{
            almacen = this.mdlAlmacen.get(idAlmacen, cnx);
        }
        return almacen;
    }
}
